# -*- coding: utf-8 -*-
import scrapy
from scrapy.selector import Selector
from scrapy.http import Request
from xiaohua_spider.items import XiaohuaSpiderItem

class XiaohuaSpider(scrapy.Spider):
    name = 'xiaohua'    #爬虫名
    allowed_domains = ['xiaohuar.com']   #为了防止爬虫项目爬取到其他网站，设置限制，每次请求前求前都会检查请求的网址是否属于这个域名下，是的话才允许请求。注意:爬取日志爬取网址后响应总为None,检查allowed_domain书写是否正确。值是一级域名
    start_urls = ['http://xiaohuar.com/hua/']
    #第一个请求的url, 所有请求的入口。

#   自定义头部，可以在代码中载入设置或写在setting.py中写
    custom_settings = {
        'DEFAULT_REQUEST_HEADERS':{
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'Accept-Language': 'zh-CN,zh;q=0.9',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3608.4 Safari/537.36'
        }
    }
    # 存放待爬取的url，scrapy会自动去重或重试失败链接，我们只需要url集合中添加为爬取得url
    url_set = set()
    def parse(self, response):
        """请求首页图集列表之后得到图集列表，解析获得的图集详情页地址"""
        # 首先重写parse，否则父类会报NotImplement异常
        # response.xpath()。如果安装过lxml，scrapy默认用lxml.etree。etree.HTML(resp.content)
        a_list = Selector(response).xpath('//div[@class="img"]/a')
        for a in a_list:
            detail_url = a.xpath('.//@href').extract_first()
            if detail_url in self.url_set:
                #已经爬取过
                pass
            else:
                #添加到到爬取连接池
                self.url_set.add(detail_url)
                #发现画廊urlhttp://www.xiaohuar.com/s-1-2015.html，和详情页urlhttp://www.xiaohuar.com/p-1-2015.html 路由存在规律，可以直接转换，节省一次request请求和xpath解析
                gallery_url = detail_url.replace('/p', '/s')
                # yield 相当于同步函数里的返回值，callback相当于方法嵌套调用，只不过这两个关键字表现异步处理过程，yield生成请求对象（还没有发送请求）到队列中，框架从队列中取一个请求对象去请求，得到响应后再交给回调函数处理

                yield Request(url=gallery_url, callback=self.img_parse)






    def img_parse(self,response):
        """解析请求画廊页后的html结果，生成item"""
        #'//div[@class="inner"]/a/img/@src'     图片的xpath
        # '//h1/text()'      标题的xpath
        src_list = Selector(response).xpath('//div[@class="inner"]/a/img/@src').extract()
        folder_name = Selector(response).xpath('//h1/text()').extract_first()


        for src in src_list:
            print('图片资源',src)   # self.log('图片资源', src)
            img_url= src
            # 由于网站开发技术历史原因，有路由形式访问的 '/d/file/20181216/small6ef7993ed1b6ce4f31d4b60f73c066571544975727.jpg'
            # 也有访问静态服务器接口形式的 'https://www.dxsabc.com/api/xiaohua/upload/min_img/20190110/20190110DMt7SdoZtk.jpg'
            if img_url.startswith('https'):
                pass
            else:
                # 路由形式的，协议http，没有解析xiaohuar.com
                img_url = 'http://www.xiaohuar.com' + img_url

            img_name = src.split('/')[-1]
            # 20190110AdOgzcLVqR.jpg

            # item = XiaohuaSpiderItem(folder_name=folder_name, img_name=img_name, img_url=img_url)
            item = XiaohuaSpiderItem()
            item['folder_name'] = folder_name
            item['img_name'] = img_name
            item['img_url'] = img_url
            yield item


